home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / newsgroups / misc.20010306-20010921 / 000022_news@columbia.edu _Tue Mar 13 17:21:23 2001.msg < prev    next >
Internet Message Format  |  2020-01-01  |  3KB

  1. Return-Path: <news@columbia.edu>
  2. Received: from newsmaster.cc.columbia.edu (newsmaster.cc.columbia.edu [128.59.59.30])
  3.     by monire.cc.columbia.edu (8.9.3/8.9.3) with ESMTP id RAA14242
  4.     for <kermit.misc@cpunix.cc.columbia.edu>; Tue, 13 Mar 2001 17:21:23 -0500 (EST)
  5. Received: (from news@localhost)
  6.     by newsmaster.cc.columbia.edu (8.9.3/8.9.3) id QAA25223
  7.     for kermit.misc@watsun.cc.columbia.edu; Tue, 13 Mar 2001 16:52:59 -0500 (EST)
  8. X-Authentication-Warning: newsmaster.cc.columbia.edu: news set sender to <news> using -f
  9. From: fdc@columbia.edu (Frank da Cruz)
  10. Subject: More fun with dates
  11. Date: 13 Mar 2001 21:52:59 GMT
  12. Organization: Columbia University
  13. Message-ID: <98m4rr$ok4$1@newsmaster.cc.columbia.edu>
  14. To: kermit.misc@columbia.edu
  15.  
  16.  
  17. This month's Scientific American (March 2001, p.80) includes an article
  18. "Easter as a Quasicrystal" by Ian Stewart, in which the calculation of
  19. the date of Easter is explained (and then graphed and compared to a
  20. crystalline lattice).  A ten-step algorithm is given for calculating the
  21. Gregorian date of Easter in any given year that is "easy to program on a
  22. computer").  Here's an illustration of how to do it in C-Kermit 7.1,
  23. using its new LISP-like S-expression feature:
  24.  
  25.   #!/usr/local/bin/kermit +
  26.   dcl \&m[] = Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
  27.   if ( not def \%1 || not numeric \%1 ) exit 1 Usage: \%0 year
  28.   if ( < \%1 1900 || > \%1 2199 ) exit 1 "\0: 1900 <= Year < 2100"
  29.   (setq x \%1)
  30.   (setq a (mod x 19) b (truncate (/ x 100)) c (mod x 100))
  31.   (setq d (truncate (/ b 4)) e (mod b 4))
  32.   (setq g (truncate (/ (+ (* 8 b) 13) 25)))
  33.   (setq h (mod (+ (* a 19) b (- d) (- g) 15) 30))
  34.   (setq m (truncate (/ (+ a (* h 11)) 319)))
  35.   (setq j (truncate (/ c 4)) k (truncate (mod c 4)))
  36.   (setq l (truncate (mod (+ (* 2 e) (* 2 j) m (- k) (- h) 32) 7)))
  37.   (setq n (truncate (/ (+ h (- m) l 90) 25)))
  38.   (setq p (truncate (mod (+ h (- m) l n 19) 32)))
  39.   echo \fday(\m(x)\flpad(\m(n),2,0)\flpad(\m(p),2,0)) \m(p) \&m[n] \m(x)
  40.   exit
  41.  
  42. See the article for an explanation of the algorithm and see:
  43.  
  44.   http://www.columbia.edu/kermit/ckermit3.html#x9
  45.  
  46. for an explanation of S-Expressions.  Note that the algorithm requires
  47. all arithmetic to be integer, not floating-point, hence the many TRUNCATE
  48. expressions (since S-Expressions never discard fractional parts).
  49.  
  50. In UNIX, clip the program, left-justify at least the first line and change
  51. it to point to your C-Kermit 7.1 binary, save it as "easter", then "chmod +x
  52. easter", and then you can type:
  53.  
  54.   easter 2001
  55.  
  56. (or any other year between 1900 and 2099) to find out the date for Easter
  57. in that year (years outside that range require adjustment of the algorithm).
  58. On other platforms, type "take easter 2001" (or other year) at the Kermit
  59. prompt.
  60.  
  61. Exercises:
  62.  
  63.  . Write a similar program for Rosh Hashanah, Passover, Ramadan, Tet, 
  64.    Chinese New Year, or any other holiday based on the Lunar cycle.
  65.  
  66.  . Adapt to span a wider range of years.
  67.  
  68.  . Adapt to support other calendars.
  69.  
  70. - Frank